package com.dyz.baseAlgorithm.treeStructure;

/**
 * @author: daiyizheng
 * @date: 2021/5/23 11:38
 * @description:
 */
//编写一个ArrayBinaryTree, 实现顺序存储二叉树遍历
public class ArrBinaryTree {
    private int[] arr; //存储数据结点的数组
    public ArrBinaryTree(int[] arr){
        this.arr = arr;
    }

    public static void main(String[] args) {
        int[] arr = { 1, 2, 3, 4, 5, 6, 7 };
        // 创建一个 ArrBinaryTree
        ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr);
        arrBinaryTree.preOrder(); // 1,2,4,5,3,6,7
        System.out.println();

        arrBinaryTree.infixOrder(); // 4,2,5,1,6,3,7
        System.out.println();

        arrBinaryTree.postOrder(); // 4,5,2,6,7,3,1
    }

    //顺序存储二叉树的前序遍历
    //index: 数组下标
    public void preOrder(int index){
        // 如果数组为空，或者 arr.length = 0
        if (arr == null || arr.length == 0) {
            System.out.println("数组为空，不能执行二叉树的前序遍历");
        }
        // 输出当前这个元素
        System.out.println(arr[index]);
        // 向左递归遍历
        if ((index * 2 + 1) < arr.length) {
            preOrder(2 * index + 1);
        }
        //// 向右递归遍历
        if(index*2+2<arr.length){
            preOrder(index*2+2);
        }
    }

    // 重载preOrder
    public void preOrder() {
        this.preOrder(0);
    }

    // 顺序存储二叉树的中序遍历
    public void infixOrder(int index) {
        // 如果数组为空，或者 arr.length = 0
        if (arr == null || arr.length == 0) {
            System.out.println("数组为空，不能执行二叉树的前序遍历");
        }
// 向左递归遍历
        if ((index * 2 + 1) < arr.length) {
            infixOrder(2 * index + 1);
        }
        // 输出当前这个元素
        System.out.println(arr[index]);
        // 向右递归遍历
        if ((index * 2 + 2) < arr.length) {
            infixOrder(2 * index + 2);
        }
    }

    public void infixOrder(){
        this.infixOrder(0);
    }

        // 顺序存储二叉树的后序遍历
    public void postOrder(int index) {
        // 如果数组为空，或者 arr.length = 0
        if (arr == null || arr.length == 0) {
            System.out.println("数组为空，不能执行二叉树的前序遍历");
        }
        // 向左递归遍历
        if ((index * 2 + 1) < arr.length) {
            postOrder(2 * index + 1);
        }
        // 向右递归遍历
        if ((index * 2 + 2) < arr.length) {
            postOrder(2 * index + 2);
        }
        // 输出当前这个元素
        System.out.println(arr[index]);
    }
    public void postOrder() {
        this.postOrder(0);
    }
}
